package com.zb.service.impl;

import javax.annotation.Resource;

import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import com.zb.entity.Item;
import com.zb.entity.vo.ItemVO;
import com.zb.exception.MyException;
import com.zb.repository.CategoryRepository;
import com.zb.repository.ItemRepository;
import com.zb.repository.UserRepository;
import com.zb.service.ItemService;
import com.zb.util.JsonTransfer;

import java.util.List;

/**
 * 商品服务实现类
 * @author
 */
@Service
public class ItemServiceImpl implements ItemService {
    @Resource
    private ItemRepository itemRepository;
    @Resource
    private UserRepository userRepository;
    @Resource
    private CategoryRepository categoryRepository;

    /**
     * 发布商品
     *
     * @param itemVO
     *            新增Item对象
     * @return 插入后Item对象
     */
    @Override
    public Item insertSelective(ItemVO itemVO) {
        Item newItem = new Item();
        newItem.setUser(userRepository.getOne(itemVO.getUserId()));
        newItem.setCategories(categoryRepository.findByIdIn(itemVO.getCategoryIds()));
        BeanUtils.copyProperties(itemVO, newItem);
        return itemRepository.saveAndFlush(newItem);
    }

    /**
     * 发布商品
     *
     * @param item
     *            新增Item对象
     * @return 插入后Item对象
     */
    @Override
    public Item insertSelective(Item item) {
        return itemRepository.save(item);
    }

    /**
     * 根据商品id删除商品
     *
     * @param itemId
     *            商品id
     * @return 删除结果
     */
    @Override
    public boolean deleteById(long itemId) {
        itemRepository.deleteById(itemId);
        return true;
    }

    /**
     * 更新商品信息
     *
     * @param json
     *            json字符串
     * @param item
     *            需更新Item对象
     * @return 更新后Item对象
     */
    @Override
    public Item updateItemInfo(String json, Item item) {
        item = JsonTransfer.updateSelective(json, item);
        return itemRepository.save(item);
    }

    /**
     * 根据商品id设置图片名
     *
     * @param itemId
     *            商品id
     * @param image
     *            图片名
     * @return 设置后Item对象
     */
    @Override
    public Item setImageById(long itemId, String image) {
        Item item = findById(itemId);
        item.setImage(image);
        return itemRepository.save(item);
    }

    /**
     * 修改商品id对应商品的审核状态
     *
     * @param item
     *            商品
     * @param adminId
     *            管理员id
     * @param status
     *            新审核状态
     * @return 修改后的Item对象
     * @see com.zb.entity.Item
     */
    @Override
    public Item setAuditStatus(Item item, long adminId, int status) {
        item.setAuditId(adminId);
        item.setStatus(status);
        return itemRepository.save(item);
    }

    /**
     * 根据状态分页查询所有商品
     *
     * @param status
     *            审核装态
     * @param pageNo
     *            起始页码
     * @param pageSize
     *            分页大小
     * @return 商品列表
     */
    @Override
    public Page<Item> findAllPageByStatus(int status, int pageNo, int pageSize) {
        return itemRepository.findAllByStatus(status, PageRequest.of(pageNo - 1, pageSize));
    }

    /**
     * 分页查询所有商品
     *
     * @param pageNo
     *            起始页码
     * @param pageSize
     *            分页大小
     * @return 商品列表
     */
    @Override
    public Page<Item> findAllPage(int pageNo, int pageSize) {
        return itemRepository.findAll(PageRequest.of(pageNo - 1, pageSize));
    }

    /**
     * 根据商品id查找商品
     *
     * @param id
     *            商品id
     * @return 对应Item对象 未找到返回null
     */
    @Override
    public Item findById(long id) {
        Item item = getById(id);
        if (item == null) {
            throw new MyException("商品未找到");
        }
        return item;
    }

    @Override
    public List<Item> getAllItems() {
        return itemRepository.findAll();
    }

    /**
     * 获取id对应item
     *
     * @param id
     *            item_id
     * @return item对象 不存在时返回null
     */
    private Item getById(Long id) {
        return id == null ? null : itemRepository.findById(id).orElse(null);
    }
}
